python二进制文件读取问题(大端序和小端序存储转换)

您所在的位置:网站首页 二进制文件 大端小端 python二进制文件读取问题(大端序和小端序存储转换)

python二进制文件读取问题(大端序和小端序存储转换)

#python二进制文件读取问题(大端序和小端序存储转换) | 来源: 网络整理| 查看: 265

问题描述:

我的任务是对一个二进制编码的图片文件进行读取并显示,在matlab上代码展示如下 :

123fid = fopen('20191025181135153.bin','r','ieee-be'); data = fread(fid,[2048 2049],'uint16'); imshow(uint8(data))

然而在python上读取图片时一片漆黑: 最开始的python代码:

1234567891011121314151617import cv2 import numpy as np imgData = np.fromfile("20191025181135153.bin", dtype=np.uint16,count=-1) width = 2048 height = 2049 # 注意此处用resize和reshape方法的不同 imgData= np.resize(imgData,(height,width)) print(imgData.shape) # 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。 img = imgData.astype('uint8') # 保存图片 cv2.imwrite("something.bmp", img) cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows() 问题解决

后来发现是图片编码问题,我拿到的图片数据是大端序存储(大端序和小端序存储具体的问题可以百度),matlab读取数据的fopen函数提供了大端序和小端序的参数,然而numpy中的np.fromfile却没有提供(我以为没有提供)。 解决的办法来了! np.fromfile虽然没有提供大小端序参数,其实却可以在dtype中设置!先看一下dtype类型参数表: 所以其实可以用字符代码去表示具体的类型,用该方法的好处是可以用>和来表示大小端序存储。改进的代码:

1imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1)

困扰好久的问题解决!

附完整的numpy读取二进制.bin图像并使用OpenCV展示的代码: 1234567891011121314151617import cv2 import numpy as np imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1) width = 2048 height = 2049 # 注意此处用resize和reshape方法的不同 imgData= np.resize(imgData,(height,width)) print(imgData.shape) # 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。 img = imgData.astype('uint8') # 保存图片 cv2.imwrite("something.bmp", img) cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3